class SintaksnoStablo:
    def __init__(self):
        self.cvorovi = []

    def dodaj_list(self, ime, broj_retka, leksicka_jedinka):
        #list == cvor bez djece
        self.cvorovi.append(Cvor(ime, broj_retka, leksicka_jedinka, []))

    def dodaj_cvor(self, ime_, djeca_):
        nova_djeca = []

        for n in self.cvorovi.__reversed__():
            ime_cvora = n.ime
            if ime_cvora in djeca_:
                indeks = self.cvorovi.index(n)
                dijete = self.cvorovi.pop(indeks)
                nova_djeca.insert(0, dijete)
                djeca_.remove(ime_cvora)

        # za cvorove se ne ispisuje broj retka i leksicka jedinka
        indeks= len(self.cvorovi) #nisam siguran
        novi_cvor = Cvor(ime_, '', '', nova_djeca)
        self.cvorovi.insert(indeks, novi_cvor)

    def dodaj_epsilon(self, za_znak):
        # najdesniji list u stablu pretvara u cvor <produkcija_lijevo>->$
        novi_cvor = Cvor('$', '', '', [])
        self.cvorovi.append(Cvor(za_znak, '', '', [novi_cvor]))

    def ispisi(self):
        for n in self.cvorovi:
            n.ispisi(0)



class Cvor:
    ime = ''
    broj_retka = ''
    leksicka_jedinka = ''
    djeca = []

    def __init__(self, ime_, broj_retka_, leksicka_jedinka_, djeca_):
        self.ime = ime_
        self.broj_retka = broj_retka_
        self.leksicka_jedinka = leksicka_jedinka_
        self.djeca = djeca_

    def ispisi(self, razina):
        if self.ime[0] == '<':
            print(" " * razina + self.ime)
        else:
            print(" " * razina + "%s %s %s" % (self.ime,
                                               self.broj_retka,
                                               self.leksicka_jedinka))
        for n in self.djeca:
            n.ispisi(razina+1)
